package com.java.base.exercise;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author RenPu
 * @Date 2022/7/13 14:23
 * @Version 1.0
 * @Description:
 **/
public class TestThreadLocal {

    //验证SimpleDateFormat，在多线程下是线程不安全的
    private static SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static void main(String[] args) {


        //验证多线程环境下，不安全的现象
//        while (true){
//            new Thread(()->{
//                String dateStr = f.format(new Date());
//                try {
//                    Date parseDate = f.parse(dateStr);
//                    String dateStrCheck = f.format(parseDate);
//                    boolean equals = dateStr.equals(dateStrCheck);
//                    if(!equals){
//                        System.out.println("原始字符串：{}"+dateStr+"----------------"+"转变后的字符串"+dateStrCheck);
//                    }
//                } catch (ParseException e) {
//                    e.printStackTrace();
//                }
//            }).start();
//        }



        //使用threadlocal解决，线程不安全的问题
        ThreadLocal<SimpleDateFormat> threadLocal = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

           while (true){
            new Thread(()->{
                String dateStr = threadLocal.get().format(new Date());
                try {
                    Date parseDate = threadLocal.get().parse(dateStr);
                    String dateStrCheck =threadLocal.get().format(parseDate);
                    boolean equals = dateStr.equals(dateStrCheck);
                    if(!equals){
                        System.out.println("原始字符串：{}"+dateStr+"----------------"+"转变后的字符串"+dateStrCheck);
                    }
                    System.out.println("thread local 保证多线程环境下 SimpleDateFormat 是线程安全 。。。。。");
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }).start();
        }



    }
}
